 #include <iostream>
#include <fstream>
#include <vector>
#include <hpdf.h>

const char* FONT_PATH = "/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf";  // 替换为你系统中楷体字体的路径

// 生成 PDF 文件
void createPDF(const std::string& outputFile) {
    // 创建 PDF 文档
    HPDF_Doc pdf = HPDF_New(NULL, NULL);
    if (!pdf) {
        std::cerr << "无法创建 PDF 文档!" << std::endl;
        return;
    }

    // 加载楷体字体
    HPDF_Font font = (HPDF_Font)HPDF_LoadTTFontFromFile(pdf, FONT_PATH, true);
    if (!font) {
        std::cerr << "无法加载楷体字体!" << std::endl;
        HPDF_Free(pdf);
        return;
    }

    // 打开输出文件
    HPDF_SaveToFile(pdf, outputFile.c_str());

    // 设置每页显示的字符数：300个字符
    const int charsPerPage = 300;
    const int charsPerLine = 15;
    const int linesPerPage = 20;

    // 要写入的所有文本（这里只是举例，你可以根据实际情况填充文本）
    std::string text = "这是一个测试文本，这里将包含一些中文字符。"
                       "我们希望将它们写入到 PDF 文件中。"
                       "每页包含 300 个字符，每行 15 个字符，"
                       "并且会分多页显示。";

    // 计算总字符数
    size_t totalChars = text.length();
    size_t currentPos = 0;

    while (currentPos < totalChars) {
        // 为每一页创建新的页面
        HPDF_Page page = HPDF_AddPage(pdf);
        HPDF_Page_SetFontAndSize(page, font, 12);  // 设置字体和大小
        HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT); // A4 纸张

        // 设置每页的坐标
        float x = 50.0f;  // 左边距
        float y = 800.0f;  // 起始纵坐标（从上到下）

        // 每页写入 300 个字符（每行 15 个字符，共 20 行）
        for (int i = 0; i < linesPerPage; ++i) {
            std::string lineText = text.substr(currentPos, charsPerLine); // 每行 15 个字符
            HPDF_Page_BeginText(page);
            HPDF_Page_MoveTextPos(page, x, y);  // 设置起始位置
            HPDF_Page_ShowText(page, lineText.c_str());  // 显示文本
            HPDF_Page_EndText(page);

            currentPos += charsPerLine;  // 更新已写入的位置
            y -= 20.0f;  // 下一行的纵坐标下移（每行 20 单位）
            if (currentPos >= totalChars) {
                break;
            }
        }
    }

    // 保存并关闭 PDF 文件
    HPDF_Free(pdf);
}

int main() {
    // 输出 PDF 文件路径
    std::string outputFile = "output.pdf";
    createPDF(outputFile);
    std::cout << "PDF 文件已生成: " << outputFile << std::endl;
    return 0;
}
